<!doctype html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.57.2" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Pattern | The Sky of OtsWang</title>
    <meta property="og:title" content="Pattern - The Sky of OtsWang">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2019-05-29T15:55:19&#43;08:00">
        
        
    <meta property="article:modified_time" content="2019-05-29T15:55:19&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,otswang,java,博客,python">
    <meta name="description" content="Pattern">
        
    <meta name="author" content="OtsWang">
    <meta property="og:url" content="https://otswang.gitee.io/hugo/post/design/pattern/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/hugo/css/normalize.css">
    
        <link rel="stylesheet" href="/hugo/css/prism.css">
    
    <link rel="stylesheet" href="/hugo/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="https://otswang.gitee.io/hugo/">
                        The Sky of OtsWang
                    </a>
                
                <p class="description">擅长写HelloWorld的小小码农</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    
                    
                    <a  href="https://otswang.gitee.io/hugo/" title="Home">Home</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/tags/" title="Tags">Tags</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/categories/" title="Categories">Categories</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/archives/" title="Archives">Archives</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/about/" title="About">About</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">Pattern</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2019年5月29日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="https://otswang.gitee.io/hugo/categories/design">Design</a></span>
                            
                        </div>
                        
                        
                        
                        <div class="post-content">
                            <p>设计模式概述</p>

<p><center><strong>结构性模式</strong></center></p>

<hr />

<h2 id="适配器模式">适配器模式</h2>

<p>adapter模式将一个类的接口转换为客户希望的另一种接口形式，比如需要使用List，但是提供的是Array，此时可以使用Arrays类的asList方法，将Array变为List。</p>

<pre><code class="language-java">java.util.Arrays#asList();
java.io.InputStreamReader(InputStream);

public static &lt;T&gt; List&lt;T&gt; asList(T... a) {
    return new ArrayList&lt;&gt;(a);
}

</code></pre>

<p>在我们业务代码中经常有新旧接口适配需求，可以采用该模式。</p>

<p><img src="/hugo/src/img/design/adapter.png" /></p>

<h2 id="桥接模式">桥接模式</h2>

<p>Bridge模式将抽象和具体的实现进行解耦，可以使得抽象和实现独立进行变化。</p>

<pre><code class="language-java">jdbc
</code></pre>

<p>只要你用到面向接口编程，其实都是在用桥接模式。</p>

<h2 id="组合模式">组合模式</h2>

<p>Composite模式让客户端看起来在处理单个对象和组合的时候是平等的。so in other words methods on a type accepting the same type.</p>

<pre><code class="language-java">java.util.Map#putAll(Map);
java.util.List#putAll(Collection);
</code></pre>

<p>从上面那句英文我们就可以得知，组合模式常用于递归操作的优化上，比如每个公司都有个boss系统，都会有什么菜单的功能。比如一级菜单下有二级菜单，二级菜单又有三级菜单。删除一级菜单的时候需要不断删除子菜单，那么这个设计模式你可以试试。总之，凡是有级联操作的，你都可以尝试这个设计模式。</p>

<h2 id="装饰者模式">装饰者模式</h2>

<p>Decorator模式动态的给一个对象附加额外的功能，继承的一种替代</p>

<pre><code class="language-java">// 给inputstream增添了bufferedInput和DataInput的功能
java.io.BufferedInputStream(InputStream);
java.io.DataInputStream(InputStream);
</code></pre>

<p>这个模式使用就太广了，我们常用的AOP，既有动态代理，也有装饰者的味道。</p>

<h2 id="门面-外观模式">门面/外观模式</h2>

<p>Facade模式为<strong>一组</strong>组件，接口，抽象或子系统提供简化的接口。</p>

<pre><code class="language-java">java.lang.Class;
</code></pre>

<p>我们每天使用的SLFJ日志就是门面日志，比如我们使用Dubbo，向外提供的服务就尽量采用门面模式，然后服务在调用各种service做聚合。</p>

<p><strong>对比</strong></p>

<p>适配器将一个对象包装起来以改变其接口；装饰者将一个对象包装起来以增强新的行为和责任；而外观将一群对象包装起来以简化其接口</p>

<h2 id="享元模式">享元模式</h2>

<p>使用缓存来减小对小对象的访问时间。</p>

<pre><code class="language-java">java.lang.Integer#valueOf(int);
</code></pre>

<p>用个map缓存几个对象，基本上都运用了享元的思想。</p>

<h2 id="代理模式">代理模式</h2>

<p>用于向较简单的对象代替创建复杂或耗时的对象。</p>

<pre><code class="language-java">java.lang.reflect.Proxy
</code></pre>

<p>代理模式用得很广泛，基本所有大家知道的开源框架，都用到了动态代理。</p>

<p>意图： 为其他对象提供一种代理以控制对这个对象的访问。</p>

<p>在直接访问对象时带来的问题:</p>

<ul>
<li>要访问的对象在远程的机器上。</li>

<li><p>在面向对象系统中，有些对象由于某些原因（比如对象创建开销很大，或者某些操作需要安全控制，或者需要进程外的访问），直接访问会给使用者或者系统结构带来很多麻烦，我们可以在访问此对象时加上一个对此对象的访问层。</p></li>

<li><p>和适配器模式的区别：适配器模式主要改变所考虑对象的接口，而代理模式不能改变所代理类的接口。</p></li>

<li><p>和装饰器模式的区别：装饰器模式为了增强功能，而代理模式是为了加以控制。</p></li>
</ul>

<p><center> <strong>创建模式</strong> </center></p>

<hr />

<h2 id="抽象工厂模式">抽象工厂模式</h2>

<pre><code class="language-java">java.util.Calendar#getInstance
</code></pre>

<h2 id="建造者模式">建造者模式</h2>

<p>通过定义一个类来简化复杂对象的创建。</p>

<pre><code class="language-java">java.util.EventListener
</code></pre>

<h2 id="工厂方法">工厂方法</h2>

<p>返回实际类型的方法</p>

<h2 id="原型模式">原型模式</h2>

<p>拷贝</p>

<h2 id="单例模式">单例模式</h2>

<p>用来确保只有一个实例，还有个方法是使用枚举。</p>

<p><center> 行为模式 </center></p>

<hr />

<h2 id="责任链模式">责任链模式</h2>

<p>通过把请求从一个对象传递到链条中下一个对象的方式来解除对象之间的耦合，直到请求被处理完毕。链中的对象是同一接口或抽象类的不同实现。</p>

<pre><code class="language-java">java.util.logging.Logger#log()
</code></pre>

<h2 id="命令模式">命令模式</h2>

<p>将命令包装在对象中，以便可以将其存储，传递到方法中，并像任何其他对象一样返回。</p>

<pre><code class="language-java">java.lang.Runable
</code></pre>

<h2 id="解释器模式">解释器模式</h2>

<p>此模式通常描述为该语言定义语法并使用该语法来解释该格式的语句。（This pattern generally describes defining a grammar for that language and using that grammar to interpret statements in that format.）</p>

<pre><code class="language-java">java.text.Format
</code></pre>

<h2 id="迭代器模式">迭代器模式</h2>

<p>提供一个统一的方式来访问集合中的对象</p>

<h2 id="中介者模式">中介者模式</h2>

<p>通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。比如mq，就是经典的中介者模式。</p>

<h2 id="备忘录模式">备忘录模式</h2>

<p>生成对象状态的一个快照，以便对象可以恢复原始状态而不用暴露自身的内容。比如Date对象通过自身内部的一个long值来实现备忘录模式。</p>

<pre><code class="language-java">java.util.Date
java.io.Serializable

// 在Date中有这么变量
private transient long fastTime;
</code></pre>

<h2 id="观察者模式">观察者模式</h2>

<p>为组件提供一种灵活的向感兴趣的接受者广播消息的方式</p>

<pre><code class="language-java">java.util.EventListener
</code></pre>

<p>我们业务代码一般是基于Zookeeper来做观察者的。基本上用到ZK的地方，都是在用观察者模式，比如分布式锁，比如服务发现等。</p>

<h2 id="状态模式">状态模式</h2>

<p>允许您在运行时根据内部状态轻松更改对象的行为。比如我们常见的订单状态或者各种XX状态，都可以用得上。</p>

<h2 id="策略模式">策略模式</h2>

<p>使用这个模式来将一组算法封装成一系列对象。通过调用这些对象可以灵活的改变程序的功能。 这个太高频了，常用于优化大量的<code>if-else</code></p>

<pre><code class="language-java">java.util.Comparator#compare()
javax.servlet.Filter#doFilter()
</code></pre>

<h2 id="模板方法模式">模板方法模式</h2>

<p>让子类可以重写方法的一部分，而不是整个重写，你可以控制子类需要重写那些操作。业务代码中经常遇到有很多相同的部分，我们可以做一个抽象类，子类来实现差异化</p>

<pre><code class="language-java">java.util.Collections#sort()
java.io.InputStream#read()
</code></pre>

<h2 id="访问者模式">访问者模式</h2>

<p>提供一个方便的可维护的方式来操作一组对象。它使得你在不改变操作的对象前提下，可以修改或者扩展对象的行为。</p>

<p>参考内容：</p>

<ul>
<li><a href="https://juejin.im/post/5cd842d56fb9a0323070efc0">https://juejin.im/post/5cd842d56fb9a0323070efc0</a></li>
<li><a href="https://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750451">https://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750451</a></li>
</ul>
                        </div>

                        


                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/hugo/post/design/bridge/">桥接模式</a></li>
        
        <li><a href="/hugo/post/design/prototype/">原型模式</a></li>
        
        <li><a href="/hugo/post/design/factory/">工厂方法模式</a></li>
        
        <li><a href="/hugo/post/design/single/">单例模式</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F">设计模式</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
                </div>
            </div>
            <div id="secondary">

    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="https://otswang.gitee.io/hugo/">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>

    
    <div class="clear">
        <div class="toc-article">
            <div class="toc-title">文章目录</dixsv>
            <nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#适配器模式">适配器模式</a></li>
<li><a href="#桥接模式">桥接模式</a></li>
<li><a href="#组合模式">组合模式</a></li>
<li><a href="#装饰者模式">装饰者模式</a></li>
<li><a href="#门面-外观模式">门面/外观模式</a></li>
<li><a href="#享元模式">享元模式</a></li>
<li><a href="#代理模式">代理模式</a></li>
<li><a href="#抽象工厂模式">抽象工厂模式</a></li>
<li><a href="#建造者模式">建造者模式</a></li>
<li><a href="#工厂方法">工厂方法</a></li>
<li><a href="#原型模式">原型模式</a></li>
<li><a href="#单例模式">单例模式</a></li>
<li><a href="#责任链模式">责任链模式</a></li>
<li><a href="#命令模式">命令模式</a></li>
<li><a href="#解释器模式">解释器模式</a></li>
<li><a href="#迭代器模式">迭代器模式</a></li>
<li><a href="#中介者模式">中介者模式</a></li>
<li><a href="#备忘录模式">备忘录模式</a></li>
<li><a href="#观察者模式">观察者模式</a></li>
<li><a href="#状态模式">状态模式</a></li>
<li><a href="#策略模式">策略模式</a></li>
<li><a href="#模板方法模式">模板方法模式</a></li>
<li><a href="#访问者模式">访问者模式</a></li>
</ul></li>
</ul>
</nav>
        </div>
    </div>
    

</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="https://otswang.gitee.io/hugo/">The Sky of OtsWang By OtsWang</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/Dudiao137/maupassant-hugo" target="_blank">maupassant-ots</a>.
        
    </div>
</footer>


    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script type="text/javascript" src="/hugo/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/hugo/js/totop.js?v=0.0.0" async=""></script>







 
 <script src="https://mermaidjs.github.io/scripts/mermaid.min.js"></script>
 <script>
       mermaid.initialize({ startOnLoad: true });
 </script>
</body>
</html>
